(() => {
  /**
   *   TS中的常用数据类型
   *  boolean 、number 、string 、Enum 枚举 、Void
   *
   *  元组、null 、undefined 、any、 unknown、 数组、对象
   *
   */
  console.log('============== 布尔类型数据 =================');
  // 布尔类型数据 ,只有true和false两个值

  let booleans: boolean = false || true;

  console.log('============== 数值类型 =================');
  // 数值类型 可支持浮点数  整数  二进制数字  八进制数字  十六进制数字
  let a1: number = 10; // 十进制
  let a2: number = 0b1010; // 二进制
  let a3: number = 0o12; // 八进制
  let a4: number = 0xa; // 十六进制

  console.log('================ 字符串 ===============');
  // 字符串 可使用单引号,双引号和模板字符串 ``
  let name: string = 'Semliker';

  console.log('============= 数组类型 ==================');
  // 数组类型
  // 定义形式1 : 关键字 变量名:数据类型[] = [指定数据类型元素.....]
  // 定义形式2 : 关键字 变量名:Array<数据类型> = [指定数据类型元素.....]
  let arry: number[] = [1, 1, 1, 1];
  let arry1: Array<string> = ['1', '1'];
  console.log('============= 元组 ==================');

  // 元组数据 元组类型允许表示一个已知元素数量和类型的数组
  let t1: [string, number];
  t1 = ['hello', 10]; // OK
  // t1 = [10, 'hello']; // Error 不能将类型“number”分配给类型“string”, 不能将类型“string”分配给类型“number”
  console.log('============= 枚举 ==================');
  //枚举     定义一组带名字的常量
  //  定义形式: enum 枚举名称 { 枚举项 = 数字或字符串, .....}
  //  如未指定相关数字或字符串,枚举项默认以0开始
  enum Color {
    Red,
    Green,
    Blue,
  }
  let greent = Color.Blue;
  console.log(greent); //--> 2

  console.log('=============  null和undefined  ==================');
  //  undefined 和 null 两者有各自的类型分别为 undefined 和 null。,意义不大
  let u: undefined = undefined;
  let n: null = null;

  console.log('=============  any  ==================');
  // any 类型的值无需事先执行任何形式的检查
  let any1: any;
  any1 = 1;
  any1 = 'any';
  console.log('============= void ==================');
  // void 表示没有任何类型。 当一个函数没有返回值,其返回值类型是 void：
  // 使用void定义的变量其值只能为null或undefined
  // let void1:void = 1;        //不能将类型“number”分配给类型“void”
  let unusable: void = undefined;

  console.log('============= 联合类型 ==================');
  // 联合类型 表示取值可以为多种类型中的一种
  let other: string | number | boolean = '1' || 100 || false;

  console.log('============= 类型断言 ==================');
  // 形式1 <数据类型>值
  // 形式2  值 as 数据类型
  // 须为一个整体在进行相关操作

  let someValue: any = 'this is a string';
  let strLength: number = (<string>someValue).length;
  let strLength1: number = (someValue as string).length;
})();
